package json_format

import (
	"encoding/json"
	"goskeleton/app/global/variable"
	"time"
)

// CustomTime 自定义时间类型，用于JSON序列化时格式化时间
// 适用于所有需要在JSON响应中格式化的时间字段

type CustomTime struct {
	Time time.Time
}

// MarshalJSON 自定义JSON序列化方法
// 当时间类型字段被序列化为JSON时，会使用variable.DateFormat指定的格式
func (ct CustomTime) MarshalJSON() ([]byte, error) {
	if ct.Time.IsZero() {
		return json.Marshal("")
	}
	return json.Marshal(ct.Time.Format(variable.DateFormat))
}

// UnmarshalJSON 自定义JSON反序列化方法
// 将字符串格式的时间转换为time.Time类型
func (ct *CustomTime) UnmarshalJSON(b []byte) error {
	var s string
	if err := json.Unmarshal(b, &s); err != nil {
		return err
	}
	if s == "" {
		ct.Time = time.Time{}
		return nil
	}
	t, err := time.Parse(variable.DateFormat, s)
	if err != nil {
		// 尝试其他常见格式
		t, err = time.Parse("2006-01-02 15:04:05", s)
		if err != nil {
			t, err = time.Parse("2006-01-02", s)
		}
	}
	if err == nil {
		ct.Time = t
	}
	return err
}

// ConfigureGinJSONTimeFormat 配置Gin框架的JSON序列化时间格式
// 这个函数应该在应用启动时调用，用于全局设置Gin的JSON序列化器
// 使用标准库的json包并配置自定义的时间格式
func ConfigureGinJSONTimeFormat() {
	// Gin框架默认使用encoding/json包
	// 这里我们可以通过中间件的方式来处理所有时间字段的序列化
	// 注意：在实际应用中，可能需要通过替换Gin的JSON渲染器来实现全局时间格式化
}
